home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 5
/
Amiga Tools 5.iso
/
spiele
/
patches
/
gloomc2p10
/
src
/
akiko_1.s
< prev
next >
Wrap
Text File
|
1996-01-03
|
15KB
|
569 lines
multipass
mc68020
bra.w initc2p ; offset 0: initialization routines
bra.w doc2p_1X8 ; offset 4: one pixel wide version, AGA
bra.w doc2p_1X6 ; offset 8: one pixel wide version, EHB
bra.w doc2p_2X8 ; offset 12: two pixel wide version, AGA
bra.w doc2p_2X6 ; offset 16: two pixel wide version, EHB
dc.l string ; offset 20: address of descr string
gfxbase dc.l 0 ; GfxBase
c2p_ptr dc.l 0 ; hardware address of Akiko register
dc.b '$VER: akiko_1 1.0 (4/1/96)',0
string dc.b 'A chunky to planar routine by Peter McGavin. '
dc.b 'REQUIRES AKIKO CHIP, e.g, as in CD32. '
dc.b 'Supports 6/8 bitplane, single/double width pixels.',0
gfxname dc.b 'graphics.library',0
even
gb_ChunkyToPlanarPtr equ 508
initc2p
; create 2 tables for Gloom
; a0=columns buffer to fill in (array of longs) for 1 wide pixs.
; a1=columns buffer for 2 wide pixs
; d0=how many columns (multiple of 32)
; a2=palette remapping array (do 256)
move.w #255,d1 ;#colours-1
.loop move.b d1,(0,a2,d1.w)
dbf d1,.loop
; column offsets for 1 wide pixels
; 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
; 16,17,18,19,20...
move.w d0,d1
ext.l d1
subq.l #1,d1
.loop2 move.l d1,(0,a0,d1.w*4)
dbf d1,.loop2
; column offsets for 2 wide pixels
; 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
; 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
; 32,34,36,38,40,...
lsr.w #5,d0
subq.w #1,d0
moveq #0,d1
.loop3 moveq #15,d2
.loop4 move.l d1,(a1)+
addq.l #2,d1
dbf d2,.loop4
sub.l #31,d1
moveq #15,d2
.loop5 move.l d1,(a1)+
addq.l #2,d1
dbf d2,.loop5
subq.l #1,d1
dbf d0,.loop3
; open graphics.library and retrieve gb_ChunkyToPlanarPtr
lea (gfxname,pc),a1
moveq #40,d0
move.l (4).w,a6
jsr (_LVOOpenLibrary,a6)
lea (gfxbase,pc),a0
move.l d0,(a0) ; save gfxbase
beq .end
movea.l d0,a1 ; a1 = gfxbase
move.l (gb_ChunkyToPlanarPtr,a1),(c2p_ptr-gfxbase,a0)
jsr (_LVOCloseLibrary,a6)
.end
rts
doc2p_1X8
; inputs:
; a0.l=src chunky buffer
; a1.l=dest chipmem bitmap
; d0.w=width (in pixels - multiple of 32) to convert
; d1.w=height (in pixels - even)
; d2.l=modulo from one bitplane to next (copmod-ish)
; d3.l=modulo from start of one line to start of next (linemod)
; internal:
; a2=subtract at end of one loop
; a3=akiko hardware register ptr
; a5=bitplane modulo, 1 bp to next
; d3=add at end of line
; d5=counter
move.l (c2p_ptr,pc),d4
beq .return
movea.l d4,a3 ; a3 -> akiko hardware register
movea.l d2,a5 ; a5 = bpmod
lsl.l #3,d2 ; 8 bitplanes
movea.l d2,a2 ; 8 * bpmod
suba.l a5,a2 ; 7 * bpmod
subq.l #4,a2 ; a2 = 7 * bpmod - 4
lsr.w #5,d0 ; num 32 pixels per row
move.w d0,d2
lsl.w #2,d2 ; num 8 pixels per row (dest bytesperrow)
ext.l d2 ; bytesperrow
sub.l d2,d3 ; d3 = linemod - bytesperrow
subq.w #1,d1 ; d1 = height - 1
subq.w #1,d0 ; d0 = num 32 pixels per row - 1
;;; movea.l (gfxbase,pc),a6 ; gfx lib must be open
;;; movem.l d0/d1/a0/a1,-(sp) ; but when can I close gfx lib?
;;; jsr (_LVOOwnBlitter,a6) ; gain exclusive use of Akiko
;;; movem.l (sp)+,d0/d1/a0/a1
.rowloop move.w d0,d5 ; num 32 pixels per row - 1
.innerloop move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a3),(a1) ; plane 0
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 1
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 2
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 3
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 4
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 5
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 6
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 7
suba.l a2,a1 ; -7*bpmod+4
dbra d5,.innerloop
adda.l d3,a1 ; dest skip
dbra d1,.rowloop ; next row
;;; jsr (_LVODisownBlitter,a6) ; free Akiko
.return
rts
doc2p_1X6
; inputs:
; a0.l=src chunky buffer
; a1.l=dest chipmem bitmap
; d0.w=width (in pixels - multiple of 32) to convert
; d1.w=height (in pixels - even)
; d2.l=modulo from one bitplane to next (copmod-ish)
; d3.l=modulo from start of one line to start of next (linemod)
; internal:
; a2=subtract at end of one loop
; a3=akiko hardware register ptr
; a5=bitplane modulo, 1 bp to next
; d3=add at end of line
; d5=counter
move.l (c2p_ptr,pc),d4
beq .return
movea.l d4,a3 ; a3 -> akiko hardware register
movea.l d2,a5 ; a5 = bpmod
lsl.l #2,d2 ; 6 bitplanes
movea.l d2,a2 ; 4 * bpmod
adda.l a5,a2 ; 5 * bpmod
subq.l #4,a2 ; a2 = 5 * bpmod - 4
lsr.w #5,d0 ; num 32 pixels per row
move.w d0,d2
lsl.w #2,d2 ; num 8 pixels per row (dest bytesperrow)
ext.l d2 ; bytesperrow
sub.l d2,d3 ; d3 = linemod - bytesperrow
subq.w #1,d1 ; d1 = height - 1
subq.w #1,d0 ; d0 = num 32 pixels per row - 1
;;; movea.l (gfxbase,pc),a6 ; gfx lib must be open
;;; movem.l d0/d1/a0/a1,-(sp) ; but when can I close gfx lib?
;;; jsr (_LVOOwnBlitter,a6) ; gain exclusive use of Akiko
;;; movem.l (sp)+,d0/d1/a0/a1
.rowloop move.w d0,d5 ; num 32 pixels per row - 1
.innerloop move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a3),(a1) ; plane 0
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 1
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 2
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 3
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 4
adda.l a5,a1 ; +bpmod
move.l (a3),(a1) ; plane 5
suba.l a2,a1 ; -5*bpmod+4
dbra d5,.innerloop
adda.l d3,a1 ; dest skip
dbra d1,.rowloop ; next row
;;; jsr (_LVODisownBlitter,a6) ; free Akiko
.return
rts
doc2p_2X8
; inputs:
; a0.l=src chunky buffer
; a1.l=dest chipmem bitmap
; d0.w=width (in pixels - multiple of 32) to convert
; d1.w=height (in pixels - even)
; d2.l=modulo from one bitplane to next (copmod-ish)
; d3.l=modulo from start of one line to start of next (linemod)
; internal:
; a2=subtract at end of one loop
; a3=akiko hardware register ptr
; a5=bitplane modulo, 1 bp to next
; d3=add at end of line
; d5=counter
move.l (c2p_ptr,pc),d4
beq .return
movea.l d4,a3 ; a3 -> akiko hardware register
movea.l d2,a5 ; a5 = bpmod
lsl.l #3,d2 ; 8 bitplanes
movea.l d2,a2 ; 8 * bpmod
suba.l a5,a2 ; 7 * bpmod
subq.l #4,a2 ; a2 = 7 * bpmod - 4
lsr.w #5,d0 ; num 32 pixels per row
move.w d0,d2
lsl.w #3,d2 ; num 4 pixels per row (dest bytesperrow)
ext.l d2 ; bytesperrow
sub.l d2,d3 ; d3 = linemod - bytesperrow
subq.l #4,a5 ; a5 = bpmod - 4
move.l #$aaaaaaaa,d7
subq.w #1,d1 ; d1 = height - 1
subq.w #1,d0 ; d0 = num 32 pixels per row - 1
;;; movea.l (gfxbase,pc),a6 ; gfx lib must be open
;;; movem.l d0/d1/a0/a1,-(sp) ; but when can I close gfx lib?
;;; jsr (_LVOOwnBlitter,a6) ; gain exclusive use of Akiko
;;; movem.l (sp)+,d0/d1/a0/a1
.rowloop move.w d0,d5 ; num 32 pixels per row - 1
.innerloop move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a3),d2 ; plane 0 from Akiko
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 0
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 1 from Akiko
move.l d6,(a1) ; plane 0
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 1
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 2 from Akiko
move.l d6,(a1) ; plane 1
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 2
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 3 from Akiko
move.l d6,(a1) ; plane 2
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 3
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 4 from Akiko
move.l d6,(a1) ; plane 3
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 4
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 5 from Akiko
move.l d6,(a1) ; plane 4
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 5
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 6 from Akiko
move.l d6,(a1) ; plane 5
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 6
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 7 from Akiko
move.l d6,(a1) ; plane 6
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 7
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l d6,(a1) ; plane 7
suba.l a2,a1 ; -7*bpmod+4
dbra d5,.innerloop
adda.l d3,a1 ; dest skip
dbra d1,.rowloop ; next row
;;; jsr (_LVODisownBlitter,a6) ; free Akiko
.return
rts
doc2p_2X6
; inputs:
; a0.l=src chunky buffer
; a1.l=dest chipmem bitmap
; d0.w=width (in pixels - multiple of 32) to convert
; d1.w=height (in pixels - even)
; d2.l=modulo from one bitplane to next (copmod-ish)
; d3.l=modulo from start of one line to start of next (linemod)
; internal:
; a2=subtract at end of one loop
; a3=akiko hardware register ptr
; a5=bitplane modulo, 1 bp to next
; d3=add at end of line
; d5=counter
move.l (c2p_ptr,pc),d4
beq .return
movea.l d4,a3 ; a3 -> akiko hardware register
movea.l d2,a5 ; a5 = bpmod
lsl.l #2,d2 ; 6 bitplanes
movea.l d2,a2 ; 4 * bpmod
adda.l a5,a2 ; 5 * bpmod
subq.l #4,a2 ; a2 = 5 * bpmod - 4
lsr.w #5,d0 ; num 32 pixels per row
move.w d0,d2
lsl.w #3,d2 ; num 4 pixels per row (dest bytesperrow)
ext.l d2 ; bytesperrow
sub.l d2,d3 ; d3 = linemod - bytesperrow
subq.l #4,a5 ; a5 = bpmod - 4
move.l #$aaaaaaaa,d7
subq.w #1,d1 ; d1 = height - 1
subq.w #1,d0 ; d0 = num 32 pixels per row - 1
;;; movea.l (gfxbase,pc),a6 ; gfx lib must be open
;;; movem.l d0/d1/a0/a1,-(sp) ; but when can I close gfx lib?
;;; jsr (_LVOOwnBlitter,a6) ; gain exclusive use of Akiko
;;; movem.l (sp)+,d0/d1/a0/a1
.rowloop move.w d0,d5 ; num 32 pixels per row - 1
.innerloop move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a0)+,(a3) ; next 4 pixels -> Akiko
move.l (a3),d2 ; plane 0 from Akiko
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 0
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 1 from Akiko
move.l d6,(a1) ; plane 0
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 1
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 2 from Akiko
move.l d6,(a1) ; plane 1
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 2
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 3 from Akiko
move.l d6,(a1) ; plane 2
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 3
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 4 from Akiko
move.l d6,(a1) ; plane 3
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 4
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l (a3),d2 ; plane 5 from Akiko
move.l d6,(a1) ; plane 4
adda.l a5,a1
move.l d2,d4
and.l d7,d2 ; d2 = a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.
eor.l d2,d4 ; d4 = .q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F
move.l d2,d6
lsr.l #1,d6
or.l d6,d2 ; d2 = aabbccddeeffgghhiijjkkllmmnnoopp
move.l d2,(a1)+ ; plane 5
move.l d4,d6
add.l d6,d6
or.l d4,d6 ; d6 = qqrrssttuuvvwwxxyyzzAABBCCDDEEFF
move.l d6,(a1) ; plane 5
suba.l a2,a1 ; -5*bpmod+4
dbra d5,.innerloop
adda.l d3,a1 ; dest skip
dbra d1,.rowloop ; next row
;;; jsr (_LVODisownBlitter,a6) ; free Akiko
.return
rts
end